package main.java.ensao.cryptography.rsamodule;

import java.math.BigInteger;
import java.util.Random;

public class Utils {

	
	/**
	 * Méthode qui génère un nombre entre 1 et n
	 * @param n
	 * @return
	 */
	public static BigInteger randomBigInteger(BigInteger n) {
		Random rnd = new Random();
		int maxNumBitLength = n.bitLength();
		BigInteger aRandomBigInt;
		do {
			aRandomBigInt = new BigInteger(maxNumBitLength, rnd);
		} while (aRandomBigInt.compareTo(n) > 1);
		return aRandomBigInt;
	}
	
	/**
	 * Méthode qui permet la génération des nombres premiers
	 * 
	 * @return
	 */
	public static long generateurNbrPremier() {

		long num = Math.round(Math.random() * 100);
		if (isPremier(num)) {

			return num;

		}

		return generateurNbrPremier();

	}

	/**
	 * Méthode qui vérifie si un nombre est premier
	 * 
	 * @param prNbCand
	 * @return
	 */
	public static Boolean isPremier(long prNbCand) {

		if (prNbCand == 2)
			return true;
		else {
			if (prNbCand % 2 == 0)
				return false; // si nbr est pair pas premier
			else {
				double nbLimit = Math.floor(Math.sqrt(prNbCand));
				for (double i = 3; i <= nbLimit; i = i + 2)
					if (prNbCand % i == 0) {
						return false;
					}
				return true;
			}
		}
	}

	/**
	 * Méthode de qui calcul la puissance d'un nombre modulo n
	 * 
	 * @param a
	 * @param k
	 * @param n
	 * @return
	 */
	public static int exponenciation_rapide(int a, int k, int n) {

		int p;
		for (p = 1; k > 0; k = k / 2) {
			if (k % 2 != 0)
				p = (p * a) % n;
			a = (a * a) % n;
		}
		return p;
	}

	/**
	 * Méthode qui calcule le pgcd de deux nombres
	 * 
	 * @param a
	 * @param b
	 * @return
	 */
	public static BigInteger calcul_pgcd(BigInteger a, BigInteger b) {
		BigInteger k;
		BigInteger zero = new BigInteger("0");

		while (!(b.equals(zero))) {
			k = a.mod(b);
			a = b;
			b = k;
		}

		return a;

	}

	/**
	 * Méthode qui permet de trouver le calcul du maximum
	 * 
	 * @param a
	 * @param b
	 * @return
	 */
	public static long calcul_max(long a, long b) {
		if (a < b)
			return b;
		else
			return a;
	}



}
